/**
 * 给定数组，问哪些位置可以在LIS上
 * 令mx为LIS的长度
 * 对于每个位置，Li表示以i结尾的LIS
 * Ri表示以i开头的LIS
 * 如果Li + Ri - 1 == mx
 * 则i可以在LIS上
 * 
 * LIS要用O(NlogN)的求法。
 * 可以二分，这里用了线段树
 * 
 * 多样例的W没有清空，T了5个点
 * 但为什么只是T，应该会wa很多才对???
 */
#include <bits/stdc++.h>
using namespace std;
#include <bits/extc++.h>
using namespace __gnu_pbds;


struct SegTree{ // 线段树带延迟

using llt = long long;

int N;

using value_type = int;
vector<value_type> data; // 线段树

/// 从下往上计算信息，要变动
value_type _up_(const value_type & ls, const value_type & rs) {
    return max(ls, rs);
}

/// 初始化，清零，不用动
void init(int n) {
    data.assign((N = n) + 1 << 2, value_zero());
}

/// 这个函数不用动
void modify(int pos, const int & delta){
    _modify(1, 1, N, pos, delta);
}

/// 这个函数不用动
value_type query(int a, int b){
    return _query(1, 1, N, a, b);
}

/// 这个函数不用动
void build() {
    _build(1, 1, N);
}

/// 几乎不用动
value_type _query(int t, int s, int e, int a, int b) {
    if(a <= s and e <= b) {
        return data[t];
    }

    int mid = (s + e) >> 1;
    value_type ans = value_zero(); // 如果求最值，这里不能用zero
    if(a <= mid) ans = _up_(ans, _query(lson(t), s, mid, a, b));
    if(mid < b) ans = _up_(ans, _query(rson(t), mid + 1, e, a, b));
    return ans;
}

/// 几乎不用动
void _modify(int t, int s, int e, int pos, const int & delta) {
    if(s == e) {
        data[t] = delta;
        return;
    }

    int mid = (s + e) >> 1;
    if(pos <= mid) _modify(lson(t), s, mid, pos, delta);
    else _modify(rson(t), mid + 1, e, pos, delta);
    _pushUp(t);
    return;
}

/// 这个函数不用动
void _pushUp(int t) {
    data[t] = _up_(data[lson(t)], data[rson(t)]);
}

/// 几乎不用动
void _build(int t, int s, int e) {
    if(s == e) {
        int x; cin >> x;
        data[t] = value_type(x); // 注意提供value_type的初始化
        return; 
    }
    int mid = (s + e) >> 1;
    _build(lson(t), s, mid);
    _build(rson(t), mid + 1, e);
    _pushUp(t);
}

/// 辅助函数，视线段树信息类型而变动
static const value_type & value_zero() {
    static const value_type VALUE0 = 0;
    return VALUE0;
}

/// 这两个函数不用变动
static int lson(int x) {return x << 1;}
static int rson(int x) {return lson(x) | 1;}


};


using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;

int N;
vi A, W;
vi L, R;
int M;
SegTree St;

void work(){
    cin >> N;
    A.assign(N + 1, 0);
    for(int i=1;i<=N;++i) cin >> A[i];

    W.clear();
    copy(A.begin(), A.end(), back_inserter(W));
    sort(W.begin(), W.end());
    W.erase(unique(W.begin(), W.end()), W.end());
    M = W.size() - 1;

    St.init(M);
    L.assign(N + 1, 0);
    for(int i=1;i<=N;++i){
        auto t = lower_bound(W.begin(), W.end(), A[i]) - W.begin();
        auto d = 0;
        if(t > 1) d = St.query(1, t - 1);
        St.modify(t, L[i] = d + 1);
    }

    St.init(M);
    R.assign(N + 1, 0);
    for(int i=N;i>=1;--i){
        auto t = lower_bound(W.begin(), W.end(), A[i]) - W.begin();
        auto d = 0;
        if(t < M) d = St.query(t + 1, M);
        St.modify(t, R[i] = d + 1);
    }

    int mx = 0;
    for(int i=1;i<=N;++i){
        mx = max(mx, L[i]);
    }

    vi Ans;
    for(int i=1;i<=N;++i){
        if(mx == L[i] + R[i] - 1){
            Ans.emplace_back(i);
        }
    }
    cout << Ans.size() << "\n";
    for(auto i : Ans) cout << i << " ";
    cout << "\n";
	return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	cin >> nofkase;
	while(nofkase--) work();
	return 0;
}
